﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using ProyectoGrupo5.ClasesDominio;

//20/05/2011

namespace ProyectoGrupo5.Persistencia
{
    // La clase OfertanteDAO Hereda (usa) la interface OfertanteDAO
    public class OfertanteDAO : IOfertanteDAO
    {
        //Atributos
        private String cadenaConexion = "Data Source=LOCALHOST;Initial Catalog=BOLSA_TRABAJO;User Id=PRUEBA;Password=prueba;";
        private SqlConnection conexion;

        public OfertanteDAO()
        {
             conexion = new SqlConnection(cadenaConexion);
        }

        public Ofertante CrearOfertante(Ofertante ofertante)
        {
            Ofertante existeC = this.VerificaCodigoOfertante(ofertante.CodigoOfertante);
            if (existeC != null)
            {
                throw new Exception("El Ofertante con CODIGO " + ofertante.CodigoOfertante + " ya existe!");
            }
            else
            {
              Ofertante existeR = this.VerificaCodigoRucOfertante(ofertante.CodigoOfertante, ofertante.Ruc);
              if (existeR != null)
              {
                  throw new Exception("El Ofertante con RUC " + ofertante.Ruc + " ya existe!");
              }
              else
              {
                  conexion.Open();
                  //Creamos nuestra Sentencia Insert
                  String sentencia = "Insert Into OFERTANTE Values(@co,@rs,@rc,@em,@pw);";
                  SqlCommand comando = new SqlCommand(sentencia, conexion);
                  //Agregamos nuestros parametros a nuestra consulta 
                  comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value      = ofertante.CodigoOfertante;
                  comando.Parameters.Add(new SqlParameter("@rs", SqlDbType.NVarChar)).Value = ofertante.RazonSocial;
                  comando.Parameters.Add(new SqlParameter("@rc", SqlDbType.NVarChar)).Value = ofertante.Ruc;
                  comando.Parameters.Add(new SqlParameter("@em", SqlDbType.NVarChar)).Value = ofertante.Correo;
                  comando.Parameters.Add(new SqlParameter("@pw", SqlDbType.NVarChar)).Value = ofertante.Contrasena;
                  //Ejecutamos Consulta
                  comando.ExecuteNonQuery();
                  conexion.Close();
                  return this.ObtenerOfertanteCodigo(ofertante.CodigoOfertante); //TODO: Queda pendiente de devolver objeto creado
              }
            }
        }

        public Ofertante VerificaCodigoOfertante(Int32 codigo)
        {
            conexion.Open();
            String sentencia = "Select * From OFERTANTE Where CodigoOfertante=@co";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value = codigo;
            SqlDataReader resultado = comando.ExecuteReader();
            Ofertante ofertante = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                ofertante = new Ofertante();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
            }
            resultado.Close();
            conexion.Close();
            return ofertante;
        }

        public Ofertante VerificaCodigoRucOfertante(Int32 codigo, String ruc)
        {
            conexion.Open();
            String sentencia = "Select * From OFERTANTE Where CodigoOfertante!=@co And Ruc=@rc";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value = codigo;
            comando.Parameters.Add(new SqlParameter("@rc", SqlDbType.NVarChar)).Value = ruc;
            SqlDataReader resultado = comando.ExecuteReader();
            Ofertante ofertante = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                ofertante = new Ofertante();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
            }
            resultado.Close();
            conexion.Close();
            return ofertante;
        }

        public Ofertante VerificaSoloRucOfertante(String ruc)
        {
            conexion.Open();
            String sentencia = "Select * From OFERTANTE Where Ruc=@rc";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            comando.Parameters.Add(new SqlParameter("@rc", SqlDbType.NVarChar)).Value = ruc;
            SqlDataReader resultado = comando.ExecuteReader();
            Ofertante ofertante = null;
            if (resultado.HasRows) //Si el resultado tiene filas
            {
                ofertante = new Ofertante();
                resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
            }
            resultado.Close();
            conexion.Close();
            return ofertante;
        }

        public Ofertante ObtenerOfertanteCodigo(Int32 codigo)
        {
            Ofertante existeC = this.VerificaCodigoOfertante(codigo);
            if (existeC == null)
            {
                throw new Exception("El Ofertante con CODIGO " + codigo + " No existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Select * From OFERTANTE Where CodigoOfertante=@co";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value = codigo;
                SqlDataReader resultado = comando.ExecuteReader();
                Ofertante ofertante = null;
                if (resultado.HasRows) //Si el resultado tiene filas, llenamos el objeto
                {
                    ofertante = new Ofertante();
                    resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                    ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
                    ofertante.RazonSocial     = (String)resultado["razonsocial"];
                    ofertante.Ruc             = (String)resultado["ruc"];
                    ofertante.Correo          = (String)resultado["correo"];
                    ofertante.Contrasena      = (String)resultado["contrasena"];
                }
                resultado.Close();
                conexion.Close();
                return ofertante;
            }
        }

        public Ofertante ObtenerOfertanteRuc(String ruc)
        {
            Ofertante existeC = this.VerificaSoloRucOfertante(ruc);
            if (existeC == null)
            {
                throw new Exception("El Ofertante con RUC " + ruc + " No existe!");
            }
            else
            {
                conexion.Open();
                String sentencia = "Select * From OFERTANTE Where Ruc=@rc";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                comando.Parameters.Add(new SqlParameter("@rc", SqlDbType.Int)).Value = ruc;
                SqlDataReader resultado = comando.ExecuteReader();
                Ofertante ofertante = null;
                if (resultado.HasRows) //Si el resultado tiene filas, llenamos el objeto
                {
                    ofertante = new Ofertante();
                    resultado.Read(); //Avanzar el índice de la lista de la fila 0 a la fila 1
                    ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
                    ofertante.RazonSocial     = (String)resultado["razonsocial"];
                    ofertante.Ruc             = (String)resultado["ruc"];
                    ofertante.Correo          = (String)resultado["correo"];
                    ofertante.Contrasena      = (String)resultado["contrasena"];
                }
                resultado.Close();
                conexion.Close();
                return ofertante;
            }
        }

        public Ofertante ModificarOfertante(Ofertante ofertante)
        {
          Ofertante existeC = this.VerificaCodigoOfertante(ofertante.CodigoOfertante);
          if (existeC == null)
          {
             throw new Exception("El Ofertante con CODIGO " + ofertante.CodigoOfertante + " No existe!");
          }
          else
          {
             Ofertante existeR = this.VerificaCodigoRucOfertante(ofertante.CodigoOfertante, ofertante.Ruc);
             if (existeR != null)
             {
                throw new Exception("El Ofertante con RUC " + ofertante.Ruc + "ya existe!");
             }
             else
             {
                conexion.Open();
                String sentencia = "Update OFERTANTE Set "
                + "RazonSocial=@rs, Ruc=@rc, Correo=@em, Contrasena=@pw "
                + "Where CodigoOfertante=@co";
                SqlCommand comando = new SqlCommand(sentencia, conexion);
                //Agregamos nuestros parametros a nuestra consulta 
                comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value      = ofertante.CodigoOfertante;
                comando.Parameters.Add(new SqlParameter("@rs", SqlDbType.NVarChar)).Value = ofertante.RazonSocial;
                comando.Parameters.Add(new SqlParameter("@rc", SqlDbType.NVarChar)).Value = ofertante.Ruc;
                comando.Parameters.Add(new SqlParameter("@em", SqlDbType.NVarChar)).Value = ofertante.Correo;
                comando.Parameters.Add(new SqlParameter("@pw", SqlDbType.NVarChar)).Value = ofertante.Contrasena;
                //Ejecutamos Consulta
                comando.ExecuteNonQuery();
                conexion.Close();
                return this.ObtenerOfertanteCodigo(ofertante.CodigoOfertante); //TODO: Queda pendiente de devolver objeto creado
             }
          }
      }
        
        public void EliminarOfertante(Int32 codigo)
        {
            Ofertante existeC = this.VerificaCodigoOfertante(codigo);
            if (existeC == null)
            {
                throw new Exception("El Ofertante con CODIGO " + codigo + " No existe!");
            }
            else
            {
              conexion.Open();
              String sentencia = "Delete From OFERTANTE Where CodigoOfertante=@co";
              SqlCommand comando = new SqlCommand(sentencia, conexion);
              comando.Parameters.Add(new SqlParameter("@co", SqlDbType.Int)).Value = codigo;
              comando.ExecuteNonQuery();
              conexion.Close();
            }
        }

        public ICollection<Ofertante> ListarOfertantesTodos()
        {
            List<Ofertante> listaOfertante = new List<Ofertante>();

            conexion.Open();
            String sentencia = "Select * From OFERTANTE";
            SqlCommand comando = new SqlCommand(sentencia, conexion);
            SqlDataReader resultado = comando.ExecuteReader();
            Ofertante ofertante = null;
            while (resultado.Read()) //Si el resultado tiene filas
            {
                ofertante = new Ofertante();
                ofertante.CodigoOfertante = (Int32)resultado["codigoofertante"];
                ofertante.Ruc = (String)resultado["ruc"];
                ofertante.RazonSocial = (String)resultado["razonsocial"];
                listaOfertante.Add(ofertante);
            }
            resultado.Close();
            conexion.Close();
            return listaOfertante;
        }
    }
}
